package fr.inria.diverse.k3.ui.tools;
import java.io.File;
import java.util.Collections;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.codegen.ecore.generator.Generator;
import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import fr.inria.diverse.k3.ui.wizards.pages.NewK3ProjectWizardFields;
public class GenerateGenModelCode {
/**
* @param args
*/
public static void main(String[] args) {
GenerateGenModelCode t = new GenerateGenModelCode();
t.createGenModel("My.ecore", "TEST");
}
org.eclipse.emf.codegen.ecore.Generator generator;
public Boolean existGenModel (NewK3ProjectWizardFields context) {
int i = 0;
Boolean bRet = false;
int endIndex = context.ecoreIFile.getLocation().toOSString().length();
int beginIndex = endIndex - context.ecoreIFile.getName().length();
String pathFolder = context.ecoreIFile.getLocation().toOSString().substring(0, beginIndex);
File folder = new File(pathFolder);
for(i=0 ; i < folder.list().length ; i++){
if(folder.list()[i].endsWith(".genmodel") == true){
context.genModelFile = folder.listFiles()[i].getPath();
bRet = true;
}
}
return bRet;
}
public String getBasePackage(String genModelFile) {
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
"genmodel",
new org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl());
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getURIConverter().getURIMap()
.putAll(EcorePlugin.computePlatformURIMap());
URI genModelURI = URI.createFileURI(genModelFile);
Resource resource = resourceSet.getResource(genModelURI, true);
GenModel eltGenModel = (GenModel)resource.getContents().get(0);
return eltGenModel.getGenPackages().get(0).getBasePackage();
}
public void createGenModel(String ecorepath, String outputPath) {
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
"ecore",
new org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl());
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
"genmodel",
new org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl());
IPath ecorePath = new Path(ecorepath);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getURIConverter().getURIMap()
.putAll(EcorePlugin.computePlatformURIMap());
URI ecoreURI = URI.createFileURI(ecorePath.toString());
Resource resource = resourceSet.getResource(ecoreURI, true);
EPackage ePackage = (EPackage) resource.getContents().get(0);
IPath genModelPath = ecorePath.removeFileExtension().addFileExtension(
"genmodel");
URI genModelURI = URI.createFileURI(genModelPath.toString());
Resource genModelResource = Resource.Factory.Registry.INSTANCE
.getFactory(genModelURI).createResource(genModelURI);
GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
genModelResource.getContents().add(genModel);
resourceSet.getResources().add(genModelResource);
genModel.setModelDirectory("/" + outputPath + "/src");
genModel.getForeignModel().add(ecorePath.toString());
genModel.initialize(Collections.singleton(ePackage));
GenPackage genPackage = (GenPackage) genModel.getGenPackages().get(0);
genModel.setModelName(genModelURI.trimFileExtension().lastSegment());
genPackage.setPrefix(genPackage.getNSName());
genPackage.setBasePackage("");
File f = new File(outputPath);
deleteDirectory(f);
f.mkdir();
EcorePlugin.getPlatformResourceMap().put(outputPath,
URI.createFileURI(f.getAbsolutePath() + "/"));
this.generate(genModel);
}
public void generate(GenModel genModel) {
// Generate Code
genModel.setCanGenerate(true);
GeneratorAdapterFactory.Descriptor.Registry.INSTANCE.addDescriptor(
GenModelPackage.eNS_URI,
GenModelGeneratorAdapterFactory.DESCRIPTOR);
// Create the generator and set the model-level input object.
Generator generator = new Generator();
generator.setInput(genModel);
// Generator model code.
Diagnostic d = generator.generate(genModel,
GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE,
new BasicMonitor.Printing(System.out));
System.out.println(d.getMessage());
}
public boolean deleteDirectory(File path) {
if (path.exists()) {
File[] files = path.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteDirectory(files[i]);
} else {
files[i].delete();
}
}
}
return (path.delete());
}
}